Was ist Lua?
 - Portugiesisch für Mond, seit 1993, MIT license, Tecgraf at PUC Rio
 - Scriptsprache
 - In ANSI C geschrieben
 - 2 bedeutende Implementationen:
  - PUC-Rio Lua(5.1, 5.2, 5.3)
   - schnell
  - LuaJIT
   - Just-in-Time Lua, C API kompatibel, nur teilweise ABI kompatibel
   - SEHR schnell





Wo wird Lua verwendet?
 - Alles, was ein Script-Interface gebrauchen könnte!
  - nmap
  - NetBSD
  - Linux(Lunatik-ng)
  - Apache mod_lua
  - Conky
  - DamnSmallLinux
  - NodeMCU
  - Prosody
  - Redis
  - Teamspeak3
  - TI-Nspire
  - Wireshark
  - ...
  - Spiele(Gmod, WoW, ...)





Designphilosophie:
 - Minimal!
  - Interpreter ~180kb compiled!
 - Multiparadigmensprache:
     Viele paradigmen können verwendet werden, aber keine werden impliziert
       OOP möglich,
       Funktional möglich,
       ...
 - first-class functions, garbage collection, closures, proper tail calls, coercion, bla bla bla...
 - Zahlen beginnen bei 1! (Nicht so schlimm wie man denkt!)




Datentypen:
 * string
  - "Hello World!"
  - Bytes!
   - Keine reservierten Zeichen, nicht mal NUL
   - UTF8, UTF16, Endianness, ... -> I don't care!
   - Interpreter akzeptiert UTF8
   - String-Länge ist immer noch nur Byte-Länge!
    - Library für UTF8-Zeichenmenge(Und weitere UTF8-Dinge)
  - "Immutable": Bei jeder Änderung wird ein neuer String erzeugt (langsam)
  - Funktionen in String-Tabelle: byte, char, dump, find, format, gmatch, gsub, len, lower, match, rep, reverse, sub, upper
  - Alle Funktionen der string-Tabelle sind in Strings verfügbar
  - einfache(') oder doppelte (") Anführungszeichen
  - \a	bell
    \b	back space
    \f	form feed
    \n	newline
    \r	carriage return
    \t	horizontal tab
    \v	vertical tab
    \\	backslash
    \"	double quote
    \'	single quote
    \[	left square bracket
    \]	right square bracket


 * number
  - 4,  0.4,  4.57e-3,  0.3e12,  5e+20
  - Real (Kann beimKompilieren geändert werden)
  - Keine Integer bis Lua 5.3
  - math functions: abs, acos, asin, atan, atan2, ceil, cos, cosh, deg, exp, floor, fmod, frexp, huge, ldexp, log, log10, max, min, modf, pi, pow, rad, random, randomseed, sin, sinh, sqrt, tan, tanh
   - Was man halt erwartet, min/max und einige andere sind vararg funktionen

 * tables
  - Assoziatives Array
  - Keine Festgelegte Größe!
  - Grundstruktur: { [index] = wert }
  - Alles außer nil kann sowohl index als auch Wert sein
  - Als Liste: { "foo", "bar", "buzz" } --> { [1]="foo", [2]="bar", [3]="buzz" }
  - Sowohl index aus auch wert sind referenzen auf die Werte; Updates somit ziemlich schnell
  - Iteratoren machen das arbeiten mit tabellen in schleifen einfach!
   - Iteratoren sind Funktionen, und können für alles mögliche verwendet werden(Beispiel: Iteration über datenbankeinträge)
  - Mit metatables kann man festlegen was bei aktionen mit Tabellen passiert.
   - macht Inherance möglich
   - z.B. festlegen was passiert, wenn man einen Wert aus einer tabelle holt, oder einspeist
 * function
 * coroutines
 * userdata



Syntax/Dinge
 - Keine klammern für Blöcke, ein Block wird durch ein Statement begonnen und mit end beendet.
 - Es gibt kein case-statement
 - Alles ist wahr, außer nil und false.
 - Alle variablen sind global, wenn sie nicht als local gekennzeichnet sind

-- this is a comment
--[[Hello,
I'd like to address the issue of multiline comments.
They work like this, and are quite similar to multiline strings

Cheers,

]]


local foo = [[
Alles zwischen den doppelten eckigen klammern ist ein String.
]]

local bar = [==[
Wenn man ein paar = zwischen die doppelten eckigen klammern packt kann man auch
[[ sowas in strings machen! ]]
ohne probleme!
]==]




if [truthy] then
	(bla bla bla)
end


while [truthy] do
	(bla bla bla)
end


for [var]=[start], [end], [increment] do
	(bla bla bla)
end


for [var1], [var2] in [iterator] do
	(bla bla bla)
end


do
	(bla bla bla)
end


repeat
	(bla bla bla)
until [truthy]


function foo(parm1, parm2)
	(bla bla bla)
	return "Hello World!"
end


foo = function()
	(bla bla bla)
	return "Multiple", "return", "values"
end


function vararg(...)
	local args = {...}
end


function vararg2(parm1, parm2, ...)
	return parm1+parm2
end
